package com.cx.common.utils;

import java.math.BigDecimal;

/**
 * @Author:cxy
 * @Date:2019/10/24 15:11
 *
 */
public class ArithUtil {

	public static BigDecimal getRoundDown(BigDecimal bigDecimal) {
		if (bigDecimal == null) {
			bigDecimal = BigDecimal.ZERO;
		}
		return bigDecimal.setScale(2, BigDecimal.ROUND_DOWN);
	}

	public static Double getRoundDown(Double number) {
		if (number == null) {
			return null;
		}
		BigDecimal bigDecimal = BigDecimal.valueOf(number);
		return bigDecimal.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
	}

	public static int compare(BigDecimal value) {
		return value.compareTo(new BigDecimal(0));
	}

	/**
	 * 是否是小数
	 *
	 * @param value
	 * @return
	 */
	public static boolean isSmallNum(BigDecimal value) {
		if (new BigDecimal(value.intValue()).compareTo(value) == 0) {
			return false;
		}
		return true;
	}

	public static boolean isLessEqualZero(BigDecimal value) {
		if (value == null) {
			return true;
		}
		if (value.doubleValue() <= 0) {
			return true;
		}
		return false;
	}

	public static boolean isEqualZero(BigDecimal value) {
		if (value == null) {
			return true;
		}
		if (value.doubleValue() == 0) {
			return true;
		}
		return false;
	}

	/**
	 * 提供精确加法计算的add方法
	 *
	 * @param value1 被加数
	 * @param value2 加数
	 * @return 两个参数的和
	 */
	public static double add(double value1, double value2) {
		BigDecimal b1 = BigDecimal.valueOf(value1);
		BigDecimal b2 = BigDecimal.valueOf(value2);
		return b1.add(b2).doubleValue();
	}

	/**
	 * 提供精确减法运算的sub方法
	 *
	 * @param value1 被减数
	 * @param value2 减数
	 * @return 两个参数的差
	 */
	public static double sub(double value1, double value2) {
		BigDecimal b1 = BigDecimal.valueOf(value1);
		BigDecimal b2 = BigDecimal.valueOf(value2);
		return b1.subtract(b2).doubleValue();
	}

	/**
	 * 提供精确乘法运算的mul方法
	 *
	 * @param value1 被乘数
	 * @param value2 乘数
	 * @return 两个参数的积
	 */
	public static double mul(double value1, double value2) {
		BigDecimal b1 = BigDecimal.valueOf(value1);
		BigDecimal b2 = BigDecimal.valueOf(value2);
		return b1.multiply(b2).doubleValue();
	}

	public static BigDecimal mul(BigDecimal value1, BigDecimal value2) {
		value1 = value1.multiply(value2);
		return value1.setScale(2, BigDecimal.ROUND_DOWN);
	}

	public static BigDecimal mul(BigDecimal value1, Integer value2) {
		value1 = value1.multiply(new BigDecimal(value2));
		return value1.setScale(2, BigDecimal.ROUND_DOWN);
	}

	public static BigDecimal mul(BigDecimal value1, double value2) {
		value1 = value1.multiply(BigDecimal.valueOf(value2));
		return value1.setScale(2, BigDecimal.ROUND_DOWN);

	}

	/**
	 * 提供精确的除法运算方法div
	 *
	 * @param value1 被除数
	 * @param value2 除数
	 * @param scale  精确范围
	 * @return 两个参数的商
	 * @throws IllegalAccessException
	 */
	public static double div(double value1, double value2, int scale) throws IllegalAccessException {
		// 如果精确范围小于0，抛出异常信息
		if (scale < 0) {
			throw new IllegalAccessException("精确度不能小于0");
		}
		BigDecimal b1 = BigDecimal.valueOf(value1);
		BigDecimal b2 = BigDecimal.valueOf(value2);
		return b1.divide(b2, scale).doubleValue();
	}

}
